package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件输入输出流演示
 *
 * FileInputStream类			是文件输入流，从文件中读取字节
 * 继承InputStream抽象类
 *
 * 构造方法
 * FileInputStream(File file)		通过打开与实际文件的连接来创建一个 FileInputStream ，
 *                                  该文件由文件系统中的 File对象file命名
 * FileInputStream(File file, boolean append)		 参数append表示是否追加内容
 *
 * FileInputStream(String name)		通过打开与实际文件的连接来创建一个 FileInputStream ，
 *                                  该文件由文件系统中的路径名name命名
 * FileInputStream(String name, boolean append)		 参数append表示是否追加内容
 *
 * 创建一个流对象时，必须传入一个文件路径。该路径下，如果没有该文件,会抛出 FileNotFoundException
 *
 * read()						每次可以读取一个字节的数据，提升为int类型，读取到文件末尾，返回 -1
 * read(byte[] b)				每次读取b的长度个字节到数组中，返回读取到的有效字节个数，读 取到末尾时，返回 -1
 *
 * public FileChannel getChannel()      获取与此文件输入流关联的FileChannel对象
 *
 * 流的关闭原则：先开后关，后开先关
 *
 *
 *
 *
 *
 *
 *
 * FileOutputStream类		文件输出流，是OutputStream的子类，用于将数据写入文件中
 * 当文件不存在时会创建该文件（前提是文件的路径存在，否则会抛出异常）
 *
 * 构造方法
 * public FileOutputStream(File file)					创建文件输出流以写入由指定的 File对象表示的文件
 * public FileOutputStream(File file, boolean append)	参数append为true表示追加数据，为false表示清空原有数据
 * public FileOutputStream(String name)					创建文件输出流以指定的名称写入文件
 * public FileOutputStream(String name, boolean append)
 * 								参数append为true表示追加数据，为false表示清空原有数据
 * 创建一个流对象时，必须传入一个文件路径
 * 该路径下，如果没有这个文件，会创建该文件
 * 如果有这个文件，会清空这个文件的数据
 *
 * write(int b)							每次可以写出一个字节数据，即int值对应的二进制的“低八位”
 * write(byte[] b)						每次可以写出数组中的数据
 * write(byte[] b, int off, int len)	每次写出从off索引开始，len个字节
 *
 * 写出换行，Windows系统里，换行符号是 \r\n
 * */
public class FileInputOutputStreamDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("src/io/FileInputOutputStreamDemo.java");
        FileOutputStream fos = new FileOutputStream("files/ttt.ttt");
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1)
            fos.write(buffer, 0, len);
        fos.flush();
        fos.close();
        fis.close();
    }
}
